#include "vtor_infrared.h"
#include "gpio.h"
#include "tim.h"
#include "vtor_printf.h"


#ifdef __VTOR_INFRARED_STM32F1_HAL_DEMO__

#define VTOR_INFRARED_GPIO_Port GPIOA
#define VTOR_INFRARED_Pin GPIO_PIN_1


uint8_t VtorInfrared_rxCnt = 0;
uint8_t VtorInfrared_rxBuf[32] = {0};


void VtorInfrared_StartTimer(void)
{
	HAL_TIM_Base_Start_IT(&htim1);
}

void VtorInfrared_StopTimer(void)
{
	HAL_TIM_Base_Stop_IT(&htim1);
}

int32_t VtorInfrared_GetIntervalTime()
{
	return __HAL_TIM_GET_COUNTER(&htim1) * 10;
}




uint8_t VtorInfrared_ReadPin()
{
	return HAL_GPIO_ReadPin(VTOR_INFRARED_GPIO_Port, VTOR_INFRARED_Pin);
}


void VtorInfrared_Init()
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	GPIO_InitStruct.Pin = VTOR_INFRARED_Pin;
	GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	HAL_GPIO_Init(VTOR_INFRARED_GPIO_Port, &GPIO_InitStruct);
	
	HAL_NVIC_SetPriority(EXTI1_IRQn, 0, 0);
	HAL_NVIC_EnableIRQ(EXTI1_IRQn);

	// 配置定时器，时钟分频到10us，20ms溢出中断，向上计数
	// prescaler = 720 - 1; 分频到10us增加一个cnt
	// arr(Period) = 2000 - 1; 20ms溢出中断，打印所有数据，且停止定时器
}



// 中断
//void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
//{
//	if(GPIO_Pin == VTOR_INFRARED_Pin)
//	{
//		VtorInfrared_ExtiIrqHandler();
//	}
//}

//// 定时器中断机制
//void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
//{
//	if(htim == &htim1)
//	{
//		if(VtorInfrared_bufferIdx > 0)
//		{
//			VtorInfrared_RxIdleCallback();
//			VtorInfrared_bufferIdx = 0;
//		}
//	}
//}

// 轮询机制
void VtorInfrared_RxTask()
{
	if(VtorInfrared_rxTimeout > 0)
	{
		if(--VtorInfrared_rxTimeout == 0)
		{
			VtorInfrared_StopTimer();
			if(VtorInfrared_rxCnt > 0)
			{

				VtorInfrared_rxCnt = 0;
			}
		}
	}
}


// 单字节接收中断回调
void VtorInfrared_RecvByteCallback(uint8_t rxByte)
{
	VtorInfrared_rxBuf[VtorInfrared_rxCnt] = rxByte;
	VtorInfrared_rxCnt++;
	VtorInfrared_rxCnt %= 32;
}



#endif // __VTOR_INFRARED_STM32F1_HAL_DEMO__


